home *** CD-ROM | disk | FTP | other *** search
/ Aminet 6 / Aminet 6 - June 1995.iso / Aminet / gfx / 3d / irit50src.lha / irit5 / prsr_lib / trimread.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-01-29  |  7.7 KB  |  221 lines

  1. /******************************************************************************
  2. * TrimRead.c - Trimmed surfaces reading from files.                  *
  3. *******************************************************************************
  4. * Written by Gershon Elber, Dec. 94.                          *
  5. ******************************************************************************/
  6.  
  7. #include "prsr_loc.h"
  8. #include "ctype.h"
  9.  
  10. /*****************************************************************************
  11. * DESCRIPTION:                                                               M
  12. * Reads from a file trimmed surfaces.                         M
  13. *   If error is detected in reading the file, ErrStr is set to a string      M
  14. * describing the error and Line to the line it occured in file.             M
  15. *   If no error is detected *ErrStr = NULL.                     M
  16. *                                                                            *
  17. * PARAMETERS:                                                                M
  18. *   FileName:     To read the trimmed surface from.                      M
  19. *   ErrStr:       Will be initialized if an error has occured.               M
  20. *   ErrLine:      Line number in file FileName of the error, if occured.     M
  21. *                                                                            *
  22. * RETURN VALUE:                                                              M
  23. *   TrimSrfStruct *: The read trimmed surface, or NULL if an error occured.  M
  24. *                                                                            *
  25. * KEYWORDS:                                                                  M
  26. *   TrivTVReadFromFile, files, read, trivariates                             M
  27. *****************************************************************************/
  28. TrimSrfStruct *TrimReadTrimmedSrfFromFile(char *FileName,
  29.                       char **ErrStr,
  30.                       int *ErrLine)
  31. {
  32.     int Handler;
  33.     FILE *f;
  34.     IPTokenType Token;
  35.     char StringToken[LINE_LEN];
  36.     TrimSrfStruct *TrimSrf;
  37.  
  38.     if ((f = fopen(FileName, "r")) == NULL) {
  39.     *ErrStr = "File not found";
  40.     *ErrLine = 0;
  41.     return NULL;
  42.     }
  43.     Handler = IritPrsrOpenStreamFromFile(f, TRUE,
  44.                      IritPrsrSenseBinaryFile(FileName),
  45.                      FALSE);
  46.  
  47.     while ((Token = _IPGetToken(Handler, StringToken)) != IP_TOKEN_EOF &&
  48.        Token != IP_TOKEN_OPEN_PAREN);
  49.  
  50.     /* We found beginning of definition - read one: */
  51.     if (_IPGetToken(Handler, StringToken) != IP_TOKEN_TRIMSRF ||
  52.     (Token = _IPGetToken(Handler, StringToken)) == IP_TOKEN_EOF) {
  53.         *ErrStr = "TRIMSRF key words expected";
  54.     *ErrLine = _IPStream[Handler].LineNum;
  55.     return NULL;
  56.     }
  57.  
  58.     TrimSrf = TrimReadTrimmedSrfFromFile2(Handler, TRUE, ErrStr, ErrLine);
  59.  
  60.     IritPrsrCloseStream(Handler, TRUE);
  61.  
  62.     return TrimSrf;
  63. }
  64.  
  65. /*****************************************************************************
  66. * DESCRIPTION:                                                               M
  67. * Reads from a file a trimmed surface.                         M
  68. *   If error is found in reading the file, ErrStr is set to a string         M
  69. * describing it and ErrLine to line it occured in file relative to begining  M
  70. * of trivariate.                                 M
  71. *   Assumes the [TRIMSRF prefix was read if NameWasRead.             M
  72. *   If no error is detected *ErrStr is set to NULL.                 M
  73. *                                                                            *
  74. * PARAMETERS:                                                                M
  75. *   Handler:      A handler to the open stream.                     M
  76. *   NameWasRead:  If FALSE, also reads the TRIVAR BEZIER prefix.         M
  77. *   ErrStr:       Will be initialized if an error has occured.               M
  78. *   ErrLine:      Line number in file FileName of the error, if occured.     M
  79. *                                                                            *
  80. * RETURN VALUE:                                                              M
  81. *   TrimSrfStruct *: The read trimmed surface, or NULL if an error occured.  M
  82. *                                                                            *
  83. * KEYWORDS:                                                                  M
  84. *   TrivReadTrimmedSrfFromFile2, files, read, trivariates                    M
  85. *****************************************************************************/
  86. TrimSrfStruct *TrimReadTrimmedSrfFromFile2(int Handler,
  87.                        CagdBType NameWasRead,
  88.                        char **ErrStr,
  89.                        int *ErrLine)
  90. {
  91.     IPTokenType Token;
  92.     char StringToken[LINE_LEN];
  93.     TrimSrfStruct *NewTrimSrf;
  94.     CagdSrfStruct *Srf;
  95.     TrimCrvStruct
  96.     *TrimCrvs = NULL;
  97.     
  98.     if (!NameWasRead) {
  99.     while ((Token = _IPGetToken(Handler, StringToken)) != IP_TOKEN_EOF &&
  100.            Token != IP_TOKEN_OPEN_PAREN);
  101.  
  102.     /* We found beginning of definition - read one: */
  103.     if (_IPGetToken(Handler, StringToken) != IP_TOKEN_TRIMSRF) {
  104.         *ErrStr = "TRIMSRF key words expected";
  105.         *ErrLine = _IPStream[Handler].LineNum;
  106.         return NULL;
  107.         }
  108.     }
  109.  
  110.     if (_IPGetToken(Handler, StringToken) != IP_TOKEN_OPEN_PAREN) {
  111.     *ErrStr = "\"[\" expected";
  112.     *ErrLine = _IPStream[Handler].LineNum;
  113.     return NULL;
  114.     }
  115.     if (_IPGetToken(Handler, StringToken) != IP_TOKEN_SURFACE) {
  116.         *ErrStr = "SURFACE key words expected";
  117.     *ErrLine = _IPStream[Handler].LineNum;
  118.     return NULL;
  119.     }
  120.  
  121.     if ((Srf = CagdSrfReadFromFile2(Handler, ErrStr, ErrLine)) == NULL)
  122.     return NULL;
  123.  
  124.     while (TRUE) {
  125.     TrimCrvStruct *TrimCrv;
  126.     TrimCrvSegStruct
  127.         *TrimCrvSegs = NULL;
  128.  
  129.     if ((Token = _IPGetToken(Handler, StringToken)) != IP_TOKEN_OPEN_PAREN) {
  130.         _IPUnGetToken(Handler, StringToken);
  131.         break;
  132.     }
  133.  
  134.     if ((Token = _IPGetToken(Handler, StringToken)) != IP_TOKEN_TRIMCRV) {
  135.         *ErrStr = "TRIMCRV key words expected";
  136.         *ErrLine = _IPStream[Handler].LineNum;
  137.         return NULL;
  138.     }
  139.  
  140.     while (TRUE) {
  141.         CagdCrvStruct *EucCrv, *UVCrv;
  142.         TrimCrvSegStruct *TrimCrvSeg;
  143.  
  144.         if ((Token = _IPGetToken(Handler, StringToken)) !=
  145.                                IP_TOKEN_OPEN_PAREN) {
  146.         _IPUnGetToken(Handler, StringToken);
  147.         break;
  148.         }
  149.  
  150.         if ((Token = _IPGetToken(Handler, StringToken)) !=
  151.                                IP_TOKEN_TRIMCRVSEG) {
  152.         *ErrStr = "TRIMCRVSEG key words expected";
  153.         *ErrLine = _IPStream[Handler].LineNum;
  154.         return NULL;
  155.         }
  156.         if (_IPGetToken(Handler, StringToken) != IP_TOKEN_OPEN_PAREN) {
  157.         *ErrStr = "\"[\" expected";
  158.         *ErrLine = _IPStream[Handler].LineNum;
  159.         return NULL;
  160.         }
  161.         if (_IPGetToken(Handler, StringToken) != IP_TOKEN_CURVE) {
  162.         *ErrStr = "CURVE key words expected";
  163.         *ErrLine = _IPStream[Handler].LineNum;
  164.         return NULL;
  165.         }
  166.  
  167.         if ((UVCrv = CagdCrvReadFromFile2(Handler, ErrStr, ErrLine)) == NULL)
  168.         return NULL;
  169.  
  170.         if ((Token = _IPGetToken(Handler, StringToken)) ==
  171.                                IP_TOKEN_OPEN_PAREN) {
  172.         if (_IPGetToken(Handler, StringToken) != IP_TOKEN_CURVE) {
  173.             *ErrStr = "CURVE key words expected";
  174.             *ErrLine = _IPStream[Handler].LineNum;
  175.             return NULL;
  176.         }
  177.  
  178.         if ((EucCrv = CagdCrvReadFromFile2(Handler, ErrStr, ErrLine))
  179.                                        == NULL)
  180.             return NULL;
  181.         }
  182.         else {
  183.         _IPUnGetToken(Handler, StringToken);
  184.             EucCrv = NULL;
  185.         }
  186.  
  187.         if (_IPGetToken(Handler, StringToken) != IP_TOKEN_CLOSE_PAREN) {
  188.         *ErrStr = "\"]\" expected";
  189.         *ErrLine = _IPStream[Handler].LineNum;
  190.         return NULL;
  191.         }
  192.  
  193.         TrimCrvSeg = TrimCrvSegNew(UVCrv, EucCrv);
  194.  
  195.         LIST_PUSH(TrimCrvSeg, TrimCrvSegs);
  196.     }
  197.  
  198.     if (_IPGetToken(Handler, StringToken) != IP_TOKEN_CLOSE_PAREN) {
  199.         *ErrStr = "\"]\" expected";
  200.         *ErrLine = _IPStream[Handler].LineNum;
  201.         return NULL;
  202.     }
  203.  
  204.     TrimCrv = TrimCrvNew(CagdListReverse(TrimCrvSegs));
  205.     LIST_PUSH(TrimCrv, TrimCrvs);
  206.     }
  207.  
  208.     if (_IPGetToken(Handler, StringToken) != IP_TOKEN_CLOSE_PAREN) {
  209.     *ErrStr = "\"]\" expected";
  210.     *ErrLine = _IPStream[Handler].LineNum;
  211.     return NULL;
  212.     }
  213.  
  214.     NewTrimSrf = TrimSrfNew(Srf, CagdListReverse(TrimCrvs), TRUE);
  215.  
  216.     *ErrStr = NULL;
  217.     *ErrLine = _IPStream[Handler].LineNum;
  218.  
  219.     return NewTrimSrf;
  220. }
  221.